Data mapping for reporting and what reports are to be generated (MiFID II/MiFIR)
Current trade reporting
currentTradeReport
Final output:
ZIP inside it XML. File name unknown.
When: After each trade/transaction (in payment) or OTC (Transfer event) or when Deuss Back Office needs to update the current order status (for example, “there was a wrong ISIN in the order report, I am sending a cancel correction report”).
Source: Page 3 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32017R0590, Article 1 Data standards and formats for transaction reporting
| Attribute | From where | How / Format Change |
|---|---|---|
Report status ( NEWT or CANC) | By default NEWT (the report template for currentTradeReport - payment and OTC), Deuss Back Office can send CANC (currentTradeReport — Cancellation (CANC)) then they have to send NEWT (I am cancelling this report and this is the new report). | |
| Transaction Reference Number (transaction_reference) | Payment Service payment.OTC: query Query($tokenId: BigInt!) { tokenOwners( where: { token: { tokenId_eq: $tokenId } } ) { sentTransfers { txHash from { token { tokenId } } } }} | |
| Trading venue transaction identification code | Transaction Reference Number | |
| Executing entity identification code (DEUSS LEI) | Configuration file | |
Investment Firm covered by Directive 2014/65/EU (Boolean true) | Configuration file | |
| Submitting entity identification code (LEI of Deuss) | Configuration file probably | |
| Buyer identification code (LEI of the buyer). | Payment Service payment.buyer_id → Registry Service (Company.legal_entity_id).OTC: Transfer Event ( receiver) → Indexer (CompanyWallet.entity.entityId) → Registry Service (Company.legal_entity_id) | |
Country of the branch for the buyer (country_code of the buyer's Broker) | Payment Service (buyer_id) → Registry Service (Company.distributor_id) → Partner Service (Broker.country_code).OTC: Transfer Event ( receiver) → Indexer (CompanyWallet.entity.entityId) → Registry Service (Company.distributor_id) → Partner Service (Broker.country_code) | |
| Seller identification code (LEI of the seller) | Payment Service payment.seller_id → Registry Service (Company.legal_entity_id).OTC: Transfer Event ( sender) → Indexer (CompanyWallet.owner) → Registry Service (Company.wallet_adress) → Company.legal_entity_id | |
Transmission of order indicator (the word false) | Configuration file | |
Trading date time (created) | Payment Service (payment.created).OTC (TODO): | Date and time in the following format: YYYY-MM-DDThh:mm:ss.ddddddZ. — 'YYYY' is the year; — 'MM' is the month; — 'DD' is the day; — 'T' – means that the letter 'T' shall be used — 'hh' is the hour; — 'mm' is the minute; — 'ss.dddddd' is the second and its fraction of a second; — Z is UTC time. Dates and times shall be reported in UTC. |
Trading capacity (String AOTC) | Configuration file | |
| Quantity | Payment Service: payment.price × Indexer (MarketDeal.amount).OTC: TransferEvent.amount (bond quantity) | For Payment Service: 18 digits in total, with max 5 number after the decimal point. For OTC: 18 digits in total, with max 17 numbers after the decimal point. |
| Quantity currency | Payment Service (payment.currency).OTC: Field does not exist | |
| Price | Payment Service (payment.deal_id) → Indexer MarketDeal.price / MarketDeal.amount.OTC: String NOAP | |
| Price Currency | Payment Service (payment.currency).OTC: Field does not exist | |
| Net amount | Payment (payment table):Net amount = (total_price / quantity × denomination) + (rate / 100 × daysAccrued / 365 × denomination × quantity). Where: total_price → Core bond_purchase_payment.amount.quantity → Core bond_purchase_payment.deal_id → Indexer MarketDeal.amount.denomination → Core bond_purchase_payment.deal_id → Indexer MarketDeal.marketOffer.token.bond.denomination.rate → Core bond_purchase_payment.deal_id → Indexer MarketDeal.marketOffer.token.bond.couponRates.daysAccrued → Core bond_purchase_payment.created − lastCouponDate (iteration over Bond.issueDate + Bond.couponFrequency).OTC: TODO | 18 digits in total, with max 5 numbers after the decimal point. TODO |
| Venue (MIC of Deuss) | Configuration file | |
Country of the branch membership (Deuss country_code) | Configuration file | |
| Instrument identification code | Payment Service (payment.deal_id) → Indexer MarketDeal → MarketOffer → Token → TokenContract → Bond.isin.OTC: Transfer Event ( id) → Indexer TokenOwner.token → Token.tokenContract → Bond.isin | |
| Instrument classification | TODO | |
| Notional currency 1 | Marketplace: Payment Service (payment.deal_id) → Indexer MarketDeal → MarketOffer → Token → TokenContract → Bond.currency.OTC: Transfer Event ( id) → Indexer TokenOwner.token → Token.tokenContract → Bond.currency | |
| Maturity date | Marketplace: Payment Service (payment.deal_id) → Indexer MarketDeal → MarketOffer → Token → TokenContract → Bond.maturityDate.OTC: Transfer Event ( id) → Indexer TokenOwner.token → Token.tokenContract → Bond.maturityDate | RRRR-MM-DD |
Execution within firm (the string DEUSS_AUTO_EXEC_001) | ||
Short selling indicator (the string SELL) | ||
| OTC post-trade indicator | Only exists for OTC: TODO | |
Securities financing transaction indicator (Boolean false) |
Reference data reporting of the current approved or traded bonds
currentApprovedOrTradedBondsReport
Final output:
currentApprovedOrTradedBondsReport.docx
T<MIC of Deuss>_DATINS_FIRDS_T<MIC of Deuss>_<Report number>_<last two years of a year, for example for 2026, would be 26>.zip
inside it:
T<MIC of Deuss>_DATINS_FIRDS_T<MIC of Deuss>_<Report number>_<last two years of a year, for example for 2026, would be 26>.xml
When: At 18:00 CET (UTC + 1 hour) each day, generate a XML for all bonds on the platform where (Indexer: Bond.status == PUBLISHED or Bond.status == ISSUED, and report Bond.status = SUSPENDED or Bond.status = REDEEMED or Bond.status = REPLACED for the day's report once, before you stop reporting it). This includes bonds after 18:00 CET the day before.
Source for report: Page 2 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX%3A32017R0585, Article 1 Content, standards, form and format of reference data_
Source for filename and final file format: Page 50 and 52 in https://www.esma.europa.eu/sites/default/files/library/esma65-11-1193_firds_reference_data_reporting_instructions_v2.1.pdf
| Attribute | From where | How / Format Change |
|---|---|---|
| Report number | Six digits, autoincrement, start 000001, after 999999, reset to 000001 | |
| Report date | Date of the creating of the report | YYYY-MM-DD |
| Instrument identification code (ISIN) | Registry Service (bond.isin) | |
| Instrument full name | ISIN → Bond Issuance Service (issuance_draft.isin → issuance_draft.name) | |
| Instrument classification (CFI_CODE) | TODO | |
Commodities or emission allowance derivative indicator (Boolean false) | ||
| Issuer or operator of the trading venue identifier (Bond issuer LEI) | Registry Service (bond.isin → bond.issuer → Company.legal_entity_id) | |
| Trading venue (Deuss MIC) | Configuration file | |
| Financial instrument short name (FISN) | TODO | ISO 18774 |
Request for admission to trading by issuer (Boolean true or false) | Indexer Bond.status → true: PUBLISHED, ISSUED, SUSPENDED, REDEEMED, REPLACED. false: UNREGISTERED | |
| Date of approval of the admission to trading | Indexer Bond.history → filter action = BOND_ISSUED → BondHistory.createdAt | Date and time in the following format: YYYY-MM-DDThh:mm:ss.ddddddZ. Where: — 'YYYY' is the year; — 'MM' is the month; — 'DD' is the day; — 'T' — means that the letter 'T' shall be used — 'hh' is the hour; — 'mm' is the minute; — 'ss.dddddd' is the second and its fraction of a second; — Z is UTC time. Dates and times shall be reported in UTC |
| Date of request for admission to trading | Indexer Bond.history → filter action = BOND_PUBLISHED → BondHistory.createdAt | Date and time in the following format: YYYY-MM-DDThh:mm:ss.ddddddZ. Where: — 'YYYY' is the year; — 'MM' is the month; — 'DD' is the day; — 'T' — means that the letter 'T' shall be used — 'hh' is the hour; — 'mm' is the minute; — 'ss.dddddd' is the second and its fraction of a second; — Z is UTC time. Dates and times shall be reported in UTC |
| Date of admission to trading or date of first trade | Date of first trade → Indexer MarketDeal → filter bond = <ISIN> → MarketDeal.createdAt (oldest entry) | Date and time in the following format: YYYY-MM-DDThh:mm:ss.ddddddZ. Where: — 'YYYY' is the year; — 'MM' is the month; — 'DD' is the day; — 'T' — means that the letter 'T' shall be used — 'hh' is the hour; — 'mm' is the minute; — 'ss.dddddd' is the second and its fraction of a second; — Z is UTC time. Dates and times shall be reported in UTC |
| Termination date | Indexer Bond.history:Bond.status == SUSPENDED → filter action = BOND_SUSPENDED → BondHistory.createdAt.Bond.status == REDEEMED → filter action = BOND_REDEEMED → BondHistory.createdAt.otherwise → field not displayed | Date and time in the following format: YYYY-MM-DDThh:mm:ss.ddddddZ. Where: — 'YYYY' is the year; — 'MM' is the month; — 'DD' is the day; — 'T' — means that the letter 'T' shall be used — 'hh' is the hour; — 'mm' is the minute; — 'ss.dddddd' is the second and its fraction of a second; — Z is UTC time. Dates and times shall be reported in UTC |
| Notional currency 1 | Registry Service (bond.isin → bond.currency) | CURRENCYCODE_3 |
| Total issued nominal amount | Registry Service (bond.isin → bond.bondCount × bond.bondNominalValue) | 18 digits in total, with max 5 numbers after the decimal point. |
| Maturity date | Registry Service (bond.isin → bond.maturityDate) | RRRR-MM-DD |
| Currency of nominal value | Registry Service (bond.isin → bond.currency) | CURRENCYCODE_3 |
| Nominal value per unit/minimum traded value | Registry Service (bond.isin → bond.bondNominalValue) | 18 digits in total, with max 5 numbers after the decimal point. |
| Fixed rate | ISIN → Indexer Bond.couponType.If Bond.couponType = FIXED → Indexer Bond.couponRates.Otherwise → field does not exist | 11 digits in total, with max 10 numbers after the decimal point. |
| Seniority of the bond | TODO |
Internal report keeping
eachTradeInstructionReport
Final output: Probably database entry (there it stays, until it is needed by the regulator or somebody else), there is no fixed/set file format. Might be nice to add the option of a .pdf or other format export.
When:
Seller report entry: Whenever a new MarketOfferHistory record with action = OFFER_REGISTERED is created in the Indexer, generate a report entry for the seller (MarketOffer.owner). This entry is then updated based on events that happen with this MarketOffer. Each of these events affects the same report entry (meaning events are assigned to the same order).
Buyer report entry: Whenever a new MarketDeal is created in the Indexer (buyer = MarketDeal.createdBy), generate a report entry for the buyer. This entry is then updated based on MarketDeal.status changes. Each of these events affects the same report entry (meaning events are assigned to the same order).
Source: Page 3 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32017R0580, Article 1 Scope, standards and format of relevant order data
| Attribute | From where | How / Format Change |
|---|---|---|
| Identification of the entity which submitted the order (Deuss LEI) | Configuration file | |
Direct Electronic Access (Boolean false) | Configuration file | |
| Client identification code (Company LEI) | Seller (MarketOffer.owner) → Indexer (CompanyWallet.owner) → Registry Service (Company.legal_entity_id).Buyer ( MarketDeal.createdBy) → Indexer (CompanyWallet.owner) → Registry Service (Company.legal_entity_id) | |
| Investment decision within firm (leave NULL) | ||
Execution within firm (the word DEUSS_AUTO_EXEC_001) | ||
| Non-executing broker (Broker LEI) | Seller (MarketOffer.owner) → Indexer (CompanyWallet.owner) → Registry Service (Company.distributor_id) → Partner Service (Broker.legal_entity_id).Buyer ( MarketDeal.createdBy) → Indexer (CompanyWallet.owner) → Registry Service (Company.distributor_id) → Partner Service (Broker.legal_entity_id) | |
Trading capacity (String AOTC) | Configuration file | |
Liquidity provision activity (Boolean false) | Configuration file | |
| Segment MIC code (Deuss MIC) | Configuration file | |
Order book code (String DEUSS-MAIN) | ||
Validity period (String GTSV) | ||
Order restriction (the String "MOFF" – (valid until accepted or is cancelled)) | ||
| Validity period and time | Seller: Indexer MarketOffer.expiry.Buyer: Indexer MarketDeal.counterOfferExpiry | Date and time in the following format: YYYY-MM-DDThh:mm:ss.ddddddZ. Where: — 'YYYY' is the year; — 'MM' is the month; — 'DD' is the day; — 'T' — means that the letter 'T' shall be used — 'hh' is the hour; — 'mm' is the minute; — 'ss.dddddd' is the second and its fraction of a second; — Z is UTC time. Dates and times shall be reported in UTC |
| Financial instrument identification code (ISIN) | Seller and Buyer: Indexer MarketOffer.token → TokenContract → Bond.isin | |
| Date of receipt | Seller and Buyer: Indexer MarketOffer.createdAt | RRRR-MM-DD |
Order type classification (String LMTO) | ||
| Limit price | Seller: Indexer MarketOffer.unitPrice.Buyer: Indexer MarketDeal.price / MarketDeal.amount (price per one unit) | 18 digits, with max 13 digits after the decimal point |
| Additional limit Price (leave NULL) | ||
| Stop Price (leave NULL) | ||
| Pegged limit price (leave NULL) | ||
| Trading venue transaction identification code | Seller: Indexer MarketOffer.offerId.Buyer: Indexer MarketDeal.dealId | |
| Transaction price | Seller and Buyer: Indexer MarketDeal.price | |
| Price currency | Seller and Buyer: Indexer MarketOffer.currency | CURRENCYCODE_3 |
Price notation (String MONE) | ||
| Buy-sell indicator | Seller: SELL.Buyer: BUYI | |
Order status (String ACTI or INAC) | Seller: Indexer MarketOffer.isActive.true → ACTI.false → INAC.Buyer: Indexer MarketDeal.status.PENDING → ACTI.other → INAC | |
Quantity notation (String UNIT) | ||
| Initial quantity | Seller: Indexer MarketOffer.totalAmount.Buyer: Indexer MarketDeal.amount | 18 digits, max 17 digits being after the decimal point |
| Remaining quantity including hidden | Seller and Buyer: Indexer MarketOffer.availableAmount | |
| Displayed quantity | Seller: Indexer MarketOffer.totalAmount.Buyer: Indexer MarketDeal.amount | 18 digits, max 17 digits being after the decimal point |
| Quantity currency (leave NULL) | ||
| Order identification code | Seller: Indexer MarketOffer.offerId.Buyer: Indexer MarketDeal.dealId | |
| Minimum Acceptable Quantity (MAQ) | Seller and Buyer: Indexer MarketOffer.lot | 18 digits, with max 17 being after the decimal point |
| Minimum executable size (MES) | Seller and Buyer: Indexer MarketOffer.lot | 18 digits, with max 17 being after the decimal point |
| Traded quantity | Seller and Buyer: Indexer MarketOffer.soldAmount | 18 digits, with max 17 being after the decimal point |
MES first execution only (Boolean false) | ||
Passive only indicator (Boolean false) | ||
| Passive or aggressive indicator (leave NULL) | ||
Self-Execution Prevention (Boolean false) | ||
| Strategy Linked Order identification (leave NULL) | ||
| Routing Strategy (leave NULL) |
For each event:
| Attribute | From where | How / Format Change |
|---|---|---|
| Sequence number | Number of the event (autoincrement) | |
| Date and Time | MarketDeal → MarketDealHistory.createdAt (timestamp of each status/event change).MarketOffer → MarketOfferHistory.createdAt (timestamp of each status/event change) | |
| New order, order modification, order cancellation, order rejections, partial or full execution (event status) | Seller:CHMO → offer frozen (TODO).CAME → MarketOfferHistory.action = OFFER_CANCELLED.EXPI → MarketOffer.expiry expired + MarketOffer.isActive = false.PARF → MarketOffer.availableAmount > 0 AND MarketOffer.soldAmount > 0.FILL → MarketOffer.availableAmount = 0.Buyer: CHMO → deal frozen (TODO).CAME → MarketDeal.status = CANCELLED.EXPI → MarketDeal.counterOfferExpiry expired.FILL → MarketDeal.status = SUCCESSFUL | |
| Trading phases (leave NULL) | ||
| Indicative auction price (leave NULL) | ||
| Indicative auction volume (leave NULL) |
Regulatory data for the change in the trading venue
tradingVenueStatusReport
Final output: Database Entry → then it goes out to CPT via venue data feed
When: Automatic report of the current status of the trading venue
Source: Page 6 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=OJ:L_202501155, Article 5 Data to be transmitted to the CTP for bonds
| Attribute | From where | How / Format Change |
|---|---|---|
| Trading venue (Deuss MIC) | TODO | |
Trading system (String OTHR) | TODO | |
| System status start date and time (date and time from which the system status is valid) | TODO | Date and time in the following format: YYYY-MM-DDThh:mm:ss.ddddddZ. Where: — 'YYYY' is the year; — 'MM' is the month; — 'DD' is the day; — 'T' — means that the letter 'T' shall be used — 'hh' is the hour; — 'mm' is the minute; — 'ss.dddddd' is the second and its fraction of a second; — Z is UTC time. Dates and times shall be reported in UTC |
Trading system status (ACTV, OTAG, POTG) | TODO |
Regulatory data for each bond
eachBondReport
Final output: Database Entry → then it goes out to CPT via venue data feed
When: After bond status changes (after its publication)
Source: Page 6 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=OJ:L_202501155, Article 5 Data to be transmitted to the CTP for bonds
| Attribute | From where | How / Format Change |
|---|---|---|
| Instrument identification code (Issuer bond ISIN code) | Registry Service (bond.isin) | |
| Instrument status start date and time (when was the bond published or its information updated) | Indexer Bond.status + BondHistory.createdAt (timestamp when status changed) | Date and time in the following format: YYYY-MM-DDThh:mm:ss.ddddddZ. Where: — 'YYYY' is the year; — 'MM' is the month; — 'DD' is the day; — 'T' — means that the letter 'T' shall be used — 'hh' is the hour; — 'mm' is the minute; — 'ss.dddddd' is the second and its fraction of a second; — Z is UTC time. Dates and times shall be reported in UTC |
| Currency | Registry Service (bond.isin → bond.currency) | CURRENCYCODE_3, three letters reflecting ISO 4217 |
| Instrument status | Bond.status == SUSPENDED → SUSP.Bond.status == REDEEMED → RMOV.Bond.status == PUBLISHED or ISSUED and previous status was SUSPENDED or REDEEMED → ACTV | |
| Trading venue (Deuss MIC) | ||
Trading system (String OTHR) |
Every transaction recording for APA or CPT
eachTradeReportForAPA_OR_CPT
Final output: Database Entry
When: After each trade in Payment Service (table payment) or OTC (Transfer event). Also Deuss Back Office can create one.
Source: Page 5 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:02017R0583-20260302, Article 7 Post-trade transparency obligations
| Attribute | From where | How / Format Change |
|---|---|---|
| Trading date and time | Payment Service payment.created.OTC: TODO | Date and time in the following format: YYYY-MM-DDThh:mm:ss.ddddddZ. Where: — 'YYYY' is the year; — 'MM' is the month; — 'DD' is the day; — 'T' — means that the letter 'T' shall be used — 'hh' is the hour; — 'mm' is the minute; — 'ss.dddddd' is the second and its fraction of a second; — Z is UTC time. Dates and times shall be reported in UTC. |
| Instrument identification code | Payment Service (payment.deal_id) → Indexer MarketDeal → MarketOffer → Token → TokenContract → Bond.isin.OTC: Transfer Event ( id) → Indexer TokenOwner.token → Token.tokenContract → Bond.isin | |
| Price | Payment Service (payment.deal_id) → Indexer MarketDeal.price / MarketDeal.amount.OTC: String NOAP | 18 digits in total, with max 13 after the decimal point. |
| Missing Price | Payment Service: Null. OTC: String NOAP | |
| Price currency | Payment Service (payment.currency).OTC: Field does not exist | |
| Price notation | Payment Service: String MONE.OTC: String NOAP | |
| Quantity | Payment Service (payment.deal_id) → Indexer MarketDeal.amount.OTC: TransferEvent.amount | 18 digits in total, with max 17 after the decimal point. |
| Notional amount | Payment Service (payment.deal_id) → Indexer MarketDeal.amount × Bond.denomination.OTC: TransferEvent.amount × Indexer (Token → TokenContract → Bond.denomination) | 18 digits in total, with max 5 after the decimal point. |
| Notional currency | Payment Service (payment.deal_id) → Indexer MarketDeal → MarketOffer → Token → TokenContract → Bond.currency.OTC: Transfer Event ( id) → Indexer TokenOwner.token → Token.tokenContract → Bond.currency | |
| Venue of execution | Payment Service: Deuss MIC. OTC: String XOFF | |
| Third-country trading venue of execution | Null | |
| Transaction Identification Code (transaction_reference) | Payment Service payment.OTC: query Query($tokenId: BigInt!) { tokenOwners( where: { token: { tokenId_eq: $tokenId } } ) { sentTransfers { txHash from { token { tokenId } } } }} | |
| Flags | Optional, by default Null | |
| Trading System | Payment Service: String OTHR.OTC: String XOFF |
Reference report for the calculation of transparency
endOfDayTransparencyReport
Final output: Database Entry
When: At the end of the day, when:
Bond.status == PUBLISHEDorISSUED- If any of the field in the table down below changes
Source: Page 131 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:02017R0583-20260302
| Attribute | From where | How / Format Change |
|---|---|---|
| Instrument identification code | Registry Service (bond.isin) | |
| Instrument full name | Registry Service (bond.isin → bond.name) | |
| MiFIR identifier | String BOND | |
| Reporting date | RRRR-MM-DD | |
| Trading venue | Deuss MIC | |
| Maturity | Registry Service (bond.maturityDate) | |
| Bond type | String CRPB | |
| Issuance date | Registry Service (bond.issueDate) |
End of day instrument report
endOfDayInstrumentReport
Final output: Database Entry
When: At the end of the day, aggregates information about each instrument on the platform. For the same ISIN, one database entry about this bonds OTC trades and one database entry for its standard trades.
Source: Page 140 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:02017R0583-20260302
| Attribute | From where | How / Format Change |
|---|---|---|
| Instrument identification code | Registry Service (bond.isin) | |
| Execution date | Payment Service (payment.created).OTC: TODO | |
| Execution venue | Payment Service: Deuss MIC. OTC: String XOFF | |
| Suspended instrument flag | Payment Service (payment.deal_id) → Indexer MarketDeal → MarketOffer → Token → TokenContract → Bond.status.Bond.status == SUSPENDED → TRUE.otherwise → FALSE.OTC: TransferEvent.id → Indexer Token → TokenContract → Bond.status.Bond.status == SUSPENDED → TRUE.otherwise → FALSE | |
| Total number of transactions | Payment Service: count of payment records where status != CREATED and created = execution date.OTC: TODO | |
| Total volume | Payment Service: sum of (MarketDeal.amount × Bond.denomination) where payment.status != CREATED and payment.created = execution date.Where: quantity → payment.deal_id → Indexer MarketDeal.amount.denomination → Registry Service (bond.isin → bond.bondNominalValue).OTC: TODO | |
| 'Size of transaction' bin range (after counting the bin range by multiplication, it is necessary to find the relevant bin range here: https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:02017R0583-20260302, page 143, Size of transaction bin) | Payment Service: MarketDeal.amount × bond.bondNominalValue.quantity → payment.deal_id → Indexer MarketDeal.amount.denomination → Registry Service (bond.isin → bond.bondNominalValue).OTC: TODO | |
| Total number of transactions executed for that bin | Payment Service: count of payment records where status != CREATED and created = execution date and trade size (MarketDeal.amount × bond.bondNominalValue) falls within the bin range.OTC: TODO | |
| Total volume traded for that bin | Payment Service: sum of (MarketDeal.amount × bond.bondNominalValue) where payment.status != CREATED and payment.created = execution date and trade size falls within the bin range.OTC: TODO |
For the legal entity notifying them about their order
succesfullTradeCompanyReport
succesfullTradeCompanyReport.docx
Final output: .pdf in the Whitelabel for downloading
When: payment.status changes to DEAL_SETTLED → notify company
Who to notify:
- Seller →
payment.receiver_wallet→ Registry Service (Company.walletAddress) → notification - Buyer →
payment.sender_wallet→ Registry Service (Company.walletAddress) → notification
Source: Page 60 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:02017R0565-20220802, Article 59 Reporting obligations in respect of execution of orders other than for portfolio management
| Attribute | From where | How / Format Change |
|---|---|---|
| Broker full company name + form | Partner Service | |
| Broker address | Partner Service | |
| Broker support phone | Partner Service | |
| Broker support email | Partner Service | |
| Broker website URL | Partner Service | |
| Broker LEI | Partner Service | |
| Broker GEMI | TODO | |
| Broker AFM | TODO | |
| Broker DOY | TODO | |
| Full Broker information (Broker full company name + form, with its registered office at Broker address, registered with the General Commercial Registry (GEMI) under number Broker GEMI, Tax Identification Number (AFM): Broker AFM, competent tax office Broker DOY) | TODO | |
| Broker Logo | TODO | |
| Deuss full company name + form | TODO | |
| Deuss address | TODO | |
| Deuss support phone | TODO | |
| Deuss support email | TODO | |
| Deuss website URL | TODO | |
| Deuss LEI | TODO | |
| Deuss GEMI | TODO | |
| Deuss AFM | TODO | |
| Deuss DOY | TODO | |
| Full Deuss information (Deuss full company name + form, with its registered office at Deuss address, registered with the General Commercial Registry (GEMI) under number Deuss GEMI, Tax Identification Number (AFM): Deuss AFM, competent tax office Deuss DOY) | TODO | |
| Deuss Logo | TODO | |
| Company name | Buyer: Core Payment Service (payment.sender_wallet) → Registry Service (Company.walletAdress) → Company.name.Seller: Core Payment Service ( payment.receiver_wallet) → Registry Service (Company.walletAdress) → Company.name | |
| Trading date and time | Buyer and Seller: Core Payment Service (payment.created) | Day, month, day, year, hour, minute, second — structured nicely as a single readable date-time string |
| Order place (Deuss MIC) | ||
| Instrument identification code (Issuer bond ISIN) | Buyer and Seller: Core Payment Service (payment.deal_id) → Indexer MarketDeal → MarketOffer → Token → TokenContract → Bond.isin | |
| Issuer bond name | Buyer and Seller: Core Payment Service (payment.deal_id) → Indexer MarketDeal → MarketOffer → Token → TokenContract → Bond.isin → Registry Service (bond.isin → bond.name) | |
| Order direction (Buy or Sell or Subscription) | payment table:payment.receiver_wallet → BUY.payment.sender_wallet → SELL | |
| Price per bond | Buyer and Seller: Core Payment Service (payment.price) | |
| Quantity | Buyer and Seller: Core Payment Service (payment.deal_id) → Indexer MarketDeal.amount | |
| Price | Buyer and Seller: Core Payment Service payment.price × Indexer (MarketDeal.amount) × Indexer MarketDeal.amount | |
| Order total fee taken | BondPurchasePayment | |
| Fee currency | From BondPurchasePayment Currency | |
| Price currency | TODO |
For the legal entity notifying them about their portfolio balance
fullCompanyPortfolioReport
fullCompanyPortfolioReport.docx
Final output: .pdf in the Whitelabel for downloading
When: Every 3 months
Source: Page 62 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:02017R0565-20220802, Article 60 Reporting obligations in respect of portfolio management
| Attribute | From where | How / Format Change |
|---|---|---|
| Broker full company name + form | Partner Service | |
| Broker address | Partner Service | |
| Broker support phone | Partner Service | |
| Broker support email | Partner Service | |
| Broker website URL | Partner Service | |
| Broker LEI | Partner Service | |
| Broker GEMI | TODO | |
| Broker AFM | TODO | |
| Broker DOY | TODO | |
| Full Broker information (Broker full company name + form, with its registered office at Broker address, registered with the General Commercial Registry (GEMI) under number Broker GEMI, Tax Identification Number (AFM): Broker AFM, competent tax office Broker DOY) | TODO | |
| Broker Logo | TODO | |
| Deuss support phone | TODO | |
| Deuss support email | TODO | |
| Deuss website URL | TODO | |
| Deuss LEI | TODO | |
| Deuss GEMI | TODO | |
| Deuss AFM | TODO | |
| Deuss DOY | TODO | |
| Deuss full company name + form | TODO | |
| Deuss address | TODO | |
| Full Deuss information (Deuss full company name + form, with its registered office at Deuss address, registered with the General Commercial Registry (GEMI) under number Deuss GEMI, Tax Identification Number (AFM): Deuss AFM, competent tax office Deuss DOY) | TODO | |
| Company name | Registry Service (Company.name) | |
| List of bond names (owned by the company) + ISIN of these bonds | Indexer TokenOwner → filter owner = company.walletAddress → list of bonds → Registry Service bond.isin + bond.name | |
| For each bond, its denomination (at the start of the period and the end of the period) | Registry Service (bond.isin → bond.bondNominalValue) | |
| For each bond, its quantity (at the start of the period and its quantity at the end) | Indexer TokenOwner → filter owner = company.walletAddress + filter token = bond.Start of period → TokenOwnerHistory → oldest record within the period.End of period → TokenOwnerHistory → latest record within the period or current TokenOwner.amount | TODO |
| For each bond, quantity × denomination (total value for the start and end of the period) | For each bond, total value = quantity × denomination.Start of period → Indexer TokenOwnerHistory (oldest record in period) × Registry Service (bond.bondNominalValue).End of period → Indexer TokenOwner.amount or TokenOwnerHistory (latest record in period) × Registry Service (bond.bondNominalValue) | TODO |
| For each bond, its currency | Registry Service (bond.isin → bond.currency) | |
| Total fees incurred | TODO | |
| Fee currency | TODO | |
| Total amount received from coupon payments | Core Payment Service (receiver_settlement_payment.amount) → filter receiver_wallet = company.walletAdress and created within period → sum of amount | |
| Liens and other encumbrances (Yes/No) | TODO | |
| Date of the report (day + month + year) | Configured for the report | |
| Time range of the report | From when to when is the report |
Public venue quality report
venueQualityReport
Final output: Whatever you want, for example a .pdf. Has to be a machine-readable format.
When: Quarterly, at the latest within three months of the end of each quarter, as follows:
a) by 30 June, information for the period from 1 January to 31 March; b) by 30 September, information for the period from 1 April to 30 June; c) by 31 December, information for the period from 1 July to 30 September; d) by 31 March, information for the period from 1 October to 31 December.
Source: Page 4 in https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32017R0575
The venueQualityReport contains the following information for each trading day:
| Attribute | From where | How / Format Change |
|---|---|---|
| Country of the competent authority (Deuss country) | TODO, probably configuration file | |
| Market segment (Deuss MIC) | TODO, probably configuration file | |
| Trading day date | TODO, probably configured for the report | |
| Outages | Description of the outage + their quantity + their average duration | |
| Planned Auction | Always Null for description, their quantity + their average duration | |
| Unsuccessful Trades (their quantity, their % from the total of trades that day) | Core Payment Service: count of payment where status = UNSUCCESSFUL and created = trading day.OTC: count of Transfer Events where blockTimestamp = trading day and receiver != null and sender != null (TODO — blockTimestamp not available).count of all payment where status != CANCELLED and created = trading day + OTC count.percentage = unsuccessful count / total count × 100 | TODO |
| Number of trade instructions | Indexer: New instructions → MarketOfferHistory → filter action = OFFER_REGISTERED and createdAt = trading day → count.Modifications → MarketOfferHistory → filter action = AMOUNTS_UPDATED and createdAt = trading day → count.Cancellations → MarketOfferHistory → filter action = OFFER_CANCELLED and createdAt = trading day → count.And for buyer side — MarketDeal status changes: New instructions → PROPOSED.Cancellations → CANCELLED, DECLINED → count.OTC: New Transfer Events where blockTimestamp = trading day → count (TODO).Total = sum of all | TODO |
| Number of executed trades | Core Payment Service: count of payment where status = DEAL_SETTLED and created = trading day.OTC: count of Transfer Events where blockTimestamp = trading day and sender != null and receiver != null (TODO — blockTimestamp not available).Total = sum of both. If total > 1 → report count. If total ≤ 1 → NULL | |
| Total value of executed trades | Core Payment Service: sum of (payment.price × Indexer MarketDeal.amount) where status = DEAL_SETTLED and created = trading day.OTC: sum of ( TransferEvent.amount × Bond.denomination) where blockTimestamp = trading day and sender != null and receiver != null (TODO — blockTimestamp not available), denomination → Registry Service (bond.bondNominalValue).Total = sum of both. If count of trades > 1 → report total value. If count of trades ≤ 1 → NULL | |
| Number of trade instructions that were cancelled | Indexer: Seller → MarketOfferHistory → filter action = OFFER_CANCELLED and createdAt = trading day → count.Buyer → MarketDeal → filter status = CANCELLED or status = DECLINED and createdAt = trading day → count.Total = sum of both counts | TODO |
| Median of trade volume | Core Payment Service: median of (MarketDeal.amount × Bond.denomination) where payment.status = DEAL_SETTLED and payment.created = trading day.quantity → payment.deal_id → Indexer MarketDeal.amount.denomination → Registry Service (bond.isin → bond.bondNominalValue).OTC: median of ( TransferEvent.amount × Bond.denomination) where blockTimestamp = trading day and sender != null and receiver != null (TODO — blockTimestamp not available).denomination → Registry Service (bond.isin → bond.bondNominalValue).Total = median of all individual trade volumes (Marketplace + OTC combined). If count of trades > 1 → report median. If count of trades ≤ 1 → NULL | |
| Median of trade instructions volume | Indexer: Seller → median of MarketOffer.totalAmount × Bond.denomination where MarketOfferHistory.action = OFFER_REGISTERED and createdAt = trading day.Buyer → median of MarketDeal.amount × Bond.denomination where createdAt = trading day.OTC: median of ( TransferEvent.amount × Bond.denomination) where blockTimestamp = trading day (TODO — blockTimestamp not available).Total = median of all individual instruction volumes (Seller + Buyer + OTC combined). If count > 1 → report median. If count ≤ 1 → NULL | |
| Number of market makers | Null, configured |
The venueQualityReport also contains each traded bond's information:
| Attribute | From where | How / Format Change |
|---|---|---|
| Name | Registry Service (bond.isin → bond.name) | |
| Identification code (ISIN) | Registry Service (bond.isin) | |
| Instrument classification (CFI) | TODO | |
| Bond currency | Registry Service (bond.isin → bond.currency) |
The venueQualityReport also contains a section detailing fees for using the platform:
| Attribute | From where | How / Format Change |
|---|---|---|
| TODO |
Report for calculating monthly values
monthlyPrudentialReport
Final output: Database
When: Each month, on the first day
Source: https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:02019R2033-20240109
| Attribute | From where | How / Format Change |
|---|---|---|
| AUM | Null | |
| CMH | Null | |
| ASA | Null | |
| NPR | Null | |
| CMG | Null | |
| TCD | Null | |
| CON | Null | |
| CVA | Null | |
| DTF | Null | |
| CMV | Null | |
| COH | Daily value of processed client orders = |purchases| + |sales|. Marketplace (cash trades): Purchases → Core Payment Service: sum of payment.total_price where buyer_company_id = customer and status != CANCELLED and created = trading day.Sales → Core Payment Service: sum of payment.total_price where seller_company_id = customer and status != CANCELLED and created = trading day.Daily COH value = |sum of purchases| + |sum of sales|. OTC (cash trades): Purchases → sum of ( TransferEvent.amount × Bond.denomination) where receiver = customer and blockTimestamp = trading day (TODO).Sales → sum of ( TransferEvent.amount × Bond.denomination) where sender = customer and blockTimestamp = trading day (TODO).Daily COH value = |sum of purchases| + |sum of sales|. COH calculation: Take daily values for the last 6 months (for Marketplace and OTC combined). Exclude the 3 most recent months. COH = arithmetic mean of daily values for the remaining 3 months. Calculated on the first trading day of each month. Exclude: payment.status = CANCELLED — cancelled orders | TODO |
| K-AUM | Null | |
| K-CMH | Null | |
| K-ASA | Null | |
| K-COH | 0.001 × COH | |
| K-NPR | Null | |
| K-CMG | Null | |
| K-TCD | Null | |
| K-CON | Null | |
| K-DTF | Null |